#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>

// 自旋锁,适合线程处理时间很短,线程挂起和轮调,线程切换时间影响很大
// 如果自旋后长时间申请不到锁,会导致cpu的浪费

int ticket = 1000;
pthread_spinlock_t spin;
void *rutine(void *args)
{
    std::string name = static_cast<const char *>(args);
    while (true)
    {
        pthread_spin_lock(&spin);
        if (ticket > 0)
        {
            ticket--;
            std::cout<<"线程-"<<name<<"买到票了:"<<ticket<<std::endl;
            usleep(1000);
            pthread_spin_unlock(&spin);
        }
        else
        {
            pthread_spin_unlock(&spin);
            break;
        }
    }
    return nullptr;
}
int main()
{
    // 第二个参数表示自旋锁的使用范围,PRIVATE指的是只能在当前进程使用,SHARED表示在多个进程间使用
    pthread_spin_init(&spin, PTHREAD_PROCESS_PRIVATE);
    pthread_t th1,th2,th3,th4;
    pthread_create(&th1,nullptr,rutine,(void*)"1");
    pthread_create(&th2,nullptr,rutine,(void*)"2");
    pthread_create(&th3,nullptr,rutine,(void*)"3");
    pthread_create(&th4,nullptr,rutine,(void*)"4");
    pthread_join(th1,nullptr);
    pthread_join(th2,nullptr);
    pthread_join(th3,nullptr);
    pthread_join(th4,nullptr);
    
    return 0;
}